package ui.controller;

import java.awt.Dimension;

import javax.swing.JOptionPane;

import database.iDatabase;
import domain.Speler;
import domain.iSpelerTeken;
import domain.exceptions.DomainException;
import domain.model.Board;
import domain.model.iGame;
import ui.view.BoardViewChar;
import ui.view.UIException;

public class TicTacToeControllerChar implements iController {
	private iGame model;
	private Speler speler;
	private BoardViewChar view;
	private iDatabase gegevensBank;
	private int[] winnendePosities;
	
	public TicTacToeControllerChar(iGame ticTacToeGame, Speler player,
			int locationslot, iDatabase database) {
		this.model = ticTacToeGame;
		this.speler = player;
		this.gegevensBank = database;
		gegevensBank.addSpeler(speler.getSpelerNaam(), speler.getScore());

		try {
			view = new BoardViewChar(this, player.getSpelerNaam(), locationslot);
			view.setVisible(true);
		} catch (UIException e) {
			JOptionPane.showInputDialog(e.getMessage());
		}
		ticTacToeGame.registerObserver(view);
	}

	@Override
	public Dimension getBoardSize() {
		Dimension boardSize = new Dimension(getNumberOfColumns() * 80,
				getNumberOfRows() * 80);
		return boardSize;
	}

	@Override
	public int getNumberOfRows() {
		return model.getBoard().getHeight();
	}

	@Override
	public int getNumberOfColumns() {
		return model.getBoard().getWidth();
	}

	@Override
	public void enable(boolean enabled) {
		view.setEnabled(enabled);
		if (enabled) {
			view.speelbaar();
		} else {
			view.onspeelbaar();
		}
	}

	@Override
	public void play(int rowClicked, int columnClicked) {
		try {
			model.play(rowClicked, columnClicked);
			speler.verhoogStappen();
			checkGameOver();
		} catch (DomainException ex) {
			JOptionPane.showMessageDialog(null, ex.getMessage());
		}
	}

	@Override
	public void updateEnemy(String enemyName) {
		view.setEnemyName(enemyName);
		view.update(model);
	}

	@Override
	public iSpelerTeken getSpelerTeken() {
		return this.speler.getSpelerTeken();
	}
		

	private void setTekens(iSpelerTeken teken1, iSpelerTeken teken2) {
		this.model.setSigns(teken1, teken2);
	}

	public String getSpelerName() {
		return speler.getSpelerNaam();
	}

	public void updateValues(TicTacToeControllerChar tictactoe2) {
		setTekens(tictactoe2.getSpelerTeken(), getSpelerTeken());
		updateEnemy(tictactoe2.getSpelerName());
	}

	@Override
	public void checkTeken(iSpelerTeken spelerChar) {
		if ((Character)getSpelerTeken().getTeken() == spelerChar.getTeken()) {
			JOptionPane.showMessageDialog(null, "Teken: '" + (Character)spelerChar.getTeken()
					+ "' is al in gebruik");
			speler.vraagTeken();
			this.model.setSigns(speler.getSpelerTeken());
		}

	}

	@Override
	public boolean checkGameOver() {
		if (model.getBoard().getWinnendePosities() != null){
			winnendePosities = model.getBoard().getWinnendePosities();
			return true;
		}
		return false;
	}

	@Override
	public String getTitel() {
		return model.getTitel();
	}

	@Override
	public Board getBoard() {
		return model.getBoard();
	}

	@Override
	public void gewonnen() {
		view.setEnabled(false);
		speler.berekenScore(true);
		speler.scoreOpslaan(gegevensBank);
		if(gegevensBank.getSpeler(speler.getSpelerNaam()) != null){
			speler.setScore(gegevensBank.getSpeler(speler.getSpelerNaam()).getScore());
		}
		view.redrawBoardGameOver(winnendePosities);
		JOptionPane.showMessageDialog(null, "Speler "
				+ getSpelerName() + " heeft gewonnen, \nje hebt nu " + speler.getScore() + " punten");
	}

	@Override
	public void verloren() {
		view.setEnabled(false);
		speler.berekenScore(false);
		speler.scoreOpslaan(gegevensBank);
		view.redrawBoard();
		JOptionPane.showMessageDialog(null, "Speler "
				+ getSpelerName() + " heeft verloren, \nje hebt nu " + speler.getScore() + " punten");
	}

	@Override
	public void askNewGame() {
		
		
	}

}
